//****************************************Copyright (c)***********************************//
// File name:           lcd
// Last modified Date:  2018/11/2 11:12:36
// Last Version:        V1.1
// Descriptions:        RGB LCD顶层模块
//****************************************************************************************//

module lcd_rgb_top(
    input              clk     ,
    input              rst_n   ,
    input  [12:0]      rd_h_pixel,  
    //RGB LCD接口 
    output             lcd_hs  ,       //LCD 行同步信号
    output             lcd_vs  ,       //LCD 场同步信号
    output             lcd_de  ,       //LCD 数据输入使能
    inout      [15:0]  lcd_rgb ,       //LCD RGB565颜色数据
    output             lcd_bl  ,       //LCD 背光控制信号
    output             lcd_rst ,       //LCD 复位信号
    output             lcd_pclk,       //LCD 采样时钟  
    output             clk_lcd,        //LCD 模块时钟
    input      [15:0]  rd_data,        //像素点数据
    output             rd_en  ,        //请求像素点颜色数据输入
	 
	 input              sdram_init_done,
	 output             out_vsync,      //lcd场信号
	 output  [10:0]     h_disp,         //LCD屏水平分辨率
    output  [10:0]     v_disp,         //LCD屏垂直分辨率
    output  [10:0]     pixel_xpos,     //像素点横坐标
    output  [10:0]     pixel_ypos,     //像素点纵坐标  	 
	 
    input        key_1,           //按键信号    
	 output          led_1, 
    input        key_2,           //按键信号    
	 output          led_2, 
	 
    output     [15:0]  lcd_id          //LCD的ID
);

//*****************************************************
//**                    main code
//*****************************************************

//RGB565数据输出                 
assign lcd_rgb = lcd_de ? pixel_data : 16'dz;
wire        data_req; 
wire [15:0] pixel_data;    

//新加入的按键
wire key_value_1;
wire key_flag_1;
wire value_1;
wire key_value_2;
wire key_flag_2;
wire value_2;
   
//读rgb lcd ID 模块
rd_id    u_rd_id(
    .clk          (clk),
    .rst_n        (rst_n),
    
    .lcd_rgb      (lcd_rgb),
    .lcd_id       (lcd_id)

);

//分频模块，根据不同的LCD ID输出相应的频率的驱动时钟
clk_div  u_clk_div(
    .clk          (clk),
    .rst_n        (rst_n),
    
    .lcd_id       (lcd_id),
    .clk_lcd      (clk_lcd)
);
//显示模块
lcd_disply u_lcd_disply(

	 .value_1               (value_1),
	 .led_1              (led_1),
	 .value_2               (value_2),
	 .led_2              (led_2),

    .lcd_clk          (clk_lcd),       //lcd模块驱动时钟
    .sys_rst_n        (rst_n & sdram_init_done),         //复位信号
    //RGB LCD接口                             
    .pixel_xpos       (pixel_xpos),    //像素点横坐标
    .pixel_ypos       (pixel_ypos),    //像素点纵坐标 
    .lcd_id           (lcd_id),        //LCD的ID    
    .rd_data          (rd_data),       //图像数据
    .rd_h_pixel       (rd_h_pixel),    //图像水平像素大小
    .pixel_data       (pixel_data)            //像素点数据
);


//lcd驱动模块    
lcd_driver u_lcd_driver(                      
    .lcd_clk        (clk_lcd),    
    .sys_rst_n      (rst_n & sdram_init_done),    

    .lcd_hs         (lcd_hs),       
    .lcd_vs         (lcd_vs),       
    .lcd_de         (lcd_de),       
    .lcd_bl         (lcd_bl),
    .lcd_rst        (lcd_rst),
    .lcd_pclk       (lcd_pclk),
	 
	 .out_vsync      (out_vsync),
	 .h_disp         (h_disp),
    .v_disp         (v_disp), 
    
    .data_req       (rd_en),                 //请求像素点颜色数据输入
    .pixel_xpos     (pixel_xpos), 
    .pixel_ypos     (pixel_ypos),
    .lcd_id         (lcd_id)
    ); 

//按键消抖模块1
key_debounce_lcd u_key_debounce_lcd(
    .lcd_clk          (clk_lcd),       //lcd模块驱动时钟
    .sys_rst_n        (rst_n & sdram_init_done),         //复位信号
    .key_1            (key_1),
    .key_flag_1       (key_flag_1),
    .key_value_1      (key_value_1)
	 );
	 
//按键消抖模块2
key_debounce_lcd_2 u_key_debounce_lcd_2(
    .lcd_clk          (clk_lcd),       //lcd模块驱动时钟
    .sys_rst_n        (rst_n & sdram_init_done),         //复位信号
    .key_2            (key_2),
    .key_flag_2       (key_flag_2),
    .key_value_2      (key_value_2)
	 );

//按键控制模块1	 
key_value_control u_key_value_control(
    .lcd_clk          (clk_lcd),       //lcd模块驱动时钟
    .sys_rst_n        (rst_n & sdram_init_done),         //复位信号
	 
	 .key_flag_1       (key_flag_1),      
    .key_value_1      (key_value_1),
    .value_1           (value_1)
    );
	 
//按键控制模块2
key_value_control_2 u_key_value_control_2(
    .lcd_clk          (clk_lcd),       //lcd模块驱动时钟
    .sys_rst_n        (rst_n & sdram_init_done),         //复位信号
	 
	 .key_flag_2       (key_flag_2),      
    .key_value_2      (key_value_2),
    .value_2           (value_2)
    );

endmodule
